Add profiler support for css validation
authorMatthias Clasen <mclasen@redhat.com>
Tue, 21 Jan 2020 01:08:41 +0000 (20:08 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Tue, 21 Jan 2020 02:55:16 +0000 (21:55 -0500)
Push numbers about css validation and style creation
to sysprof.

gtk/gtkcssnode.c

index 4fe350d5ffc83309a59d256f9fa9cc34d88afc01..72de82941e51ff846b943b13da1708b94952cc48 100644 (file)
@@ -27,6 +27,7 @@
 #include "gtksettingsprivate.h"
 #include "gtktypebuiltins.h"
 #include "gtkprivate.h"
+#include "gdkprofilerprivate.h"
 
 /*
  * CSS nodes are the backbone of the GtkStyleContext implementation and
@@ -122,6 +123,13 @@ gtk_css_node_get_style_provider_or_null (GtkCssNode *cssnode)
   return GTK_CSS_NODE_GET_CLASS (cssnode)->get_style_provider (cssnode);
 }
 
+#ifdef G_ENABLE_DEBUG
+static int invalidated_nodes;
+static int created_styles;
+static guint invalidated_nodes_counter;
+static guint created_styles_counter;
+#endif
+
 static void
 gtk_css_node_set_invalid (GtkCssNode *node,
                           gboolean    invalid)
@@ -131,6 +139,11 @@ gtk_css_node_set_invalid (GtkCssNode *node,
 
   node->invalid = invalid;
 
+#ifdef G_ENABLE_DEBUG
+  if (invalid)
+    invalidated_nodes++;
+#endif
+
   if (node->visible)
     {
       if (node->parent)
@@ -369,6 +382,10 @@ gtk_css_node_create_style (GtkCssNode   *cssnode,
   if (style)
     return g_object_ref (style);
 
+#ifdef G_ENABLE_DEBUG
+  created_styles++;
+#endif
+
   parent = cssnode->parent ? cssnode->parent->style : NULL;
 
   if (change & GTK_CSS_CHANGE_NEEDS_RECOMPUTE)
@@ -665,6 +682,14 @@ gtk_css_node_class_init (GtkCssNodeClass *klass)
                         | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
 
   g_object_class_install_properties (object_class, NUM_PROPERTIES, cssnode_properties);
+
+#ifdef G_ENABLE_DEBUG
+  if (invalidated_nodes_counter == 0)
+    {
+      invalidated_nodes_counter = gdk_profiler_define_int_counter ("invalidated-nodes", "CSS Node Invalidations");
+      created_styles_counter = gdk_profiler_define_int_counter ("created-styles", "CSS Style Creations");
+    }
+#endif
 }
 
 static void
@@ -1379,10 +1404,28 @@ void
 gtk_css_node_validate (GtkCssNode *cssnode)
 {
   gint64 timestamp;
+#ifdef G_ENABLE_DEBUG
+  gint64 before = g_get_monotonic_time ();
+#endif
 
   timestamp = gtk_css_node_get_timestamp (cssnode);
 
   gtk_css_node_validate_internal (cssnode, timestamp);
+
+#ifdef G_ENABLE_DEBUG
+  if (cssnode->parent == NULL)
+    {
+      if (gdk_profiler_is_running ())
+        {
+          gint64 after = g_get_monotonic_time ();
+          gdk_profiler_add_mark (before * 1000, (after - before) * 1000, "style", "");
+          gdk_profiler_set_int_counter (invalidated_nodes_counter, after * 1000, invalidated_nodes);
+          gdk_profiler_set_int_counter (created_styles_counter, after * 1000, created_styles);
+          invalidated_nodes = 0;
+          created_styles = 0;
+        }
+    }
+#endif
 }
 
 gboolean